#include "operations.h"
//#define DEBUG
//#define VERBOSE //si consiglia di tenere definito in ogni versione di Debug; togliere in Release

void addEdgeOp(PedgeID pid, PedgeGraph pe, PvehicleState pvs,
		PGMatrix pgm, int k, PtabooList ptl, TabooExpire now, int tenure, bool g_intent) {

	validateEdgeID(pid);

	#ifdef DEBUG
		printVehicleTQJScalars(stdout, pvs);
		printf("whogathers: %d\n", whoGathersEdge(pgm, pid));
	#endif

	bool g_success = false;
	if(g_intent && isEdgeGraphProfitable(pe) && tryToGatherEdge(pgm, pid, k))
		g_success = true;

	#ifdef VERBOSE
		printf("sto aggiungendo:"); printEdgeID(stdout, pid); printEdgeGraph(stdout, pe);
		if(!g_success)
			printf("non ");
		printf("raccogliendo.\n");
	#endif

	addEdgeToVehicleState(pid, pe, pvs, g_success); // aggiorna vehicleState

	setTaboo(ptl, pid, tenure, now); // aggiorna tabooList

	#ifdef DEBUG
		printVehicleTQJScalars(stdout, pvs); printf("\n");
	#endif
}

void removeEdgeOp(PedgeID pid, PedgeGraph pe, PvehicleState pvs,
				PGMatrix pgm, int k, PtabooList ptl, TabooExpire now, int tenure) {

	validateEdgeID(pid);

	#ifdef DEBUG
		printVehicleTQJScalars(stdout, pvs);
	#endif
	/** alla fine della procedura è Vero sse prima di rimuovere stavo raccogliendo.
	 *  questo ha fini solamente interni (modifica dei campi cache di vehicleState
	 *  pertanto non occorre restituirlo all'esterno => documentazione interna */
	bool g_success = false;

	// sto passando una sola volta E possedevo raccolta
	if(isEdgeWalkedOnceInVehiclePath(pid, pvs->pvp) && releaseIfImGatheringEdge(pgm, pid, k))
		g_success = true;

	#ifdef VERBOSE
		printf("sto rimuovendo:"); printEdgeID(stdout, pid); printEdgeGraph(stdout, pe);
		if(g_success)
			printf(" togliendo la raccolta.");
		printf("\n");
	#endif

	removeEdgeFromVehicleState(pid, pe, pvs, g_success); // aggiorna vehicleState
	setTaboo(ptl, pid, tenure, now); // aggiorna tabooList

	#ifdef DEBUG
		printVehicleTQJScalars(stdout, pvs); printf("\n");
	#endif
}
